# 迭代器
'''
判断一个对象是否是迭代器的标准仅仅是“是否同时具有__iter__()和__next__()这两个方法”
'''

# 自定义实现迭代器类
class Reverse:
    """反向遍历序列对象的迭代器"""
    def __init__(self, data):
        self.data = data
        self.index = len(data)

    def __iter__(self):
        return self

    def __next__(self):
        if self.index == 0:
            raise StopIteration
        self.index = self.index - 1
        return self.data[self.index]

rev = Reverse("longtao.com")
# print(next(rev))

def reverse(data):
    for index in range(len(data)-1, -1, -1):
        yield data[index]

for char in reverse("longtao"):
    print(char)

'''
for循环,，实际上在执行for语句的时候，Python 悄悄调用了内置函数iter()，
并将for语句中的容器对象作为参数传入；而函数iter()返回值则是一个迭代器对象
此，for语句是将容器对象转换为迭代器对象之后，调用__next__()方法，逐个访问原容器中的各个对象，
直到遍历完所有元素，抛出一个StopIteration异常，并终止for循环
'''

# TODO 总结
'''
迭代器（iterator）首先要是可迭代的（iterable）；即迭代器一定是可迭代的，但可迭代的不一定是迭代器
可迭代的对象意味着可以被转换为迭代器
迭代器需要同时具有方法__iter__()和__next__()
对迭代器调用iter()函数，得到的是这个迭代器本身
for循环实际上使用了迭代器，并且一般情况下将异常StopIteration作为循环终止条件
'''